home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / debug / SmartCrash.lha / SmartCrash / src / requestlong.ASM < prev    next >
Encoding:
Assembly Source File  |  2000-03-09  |  20.0 KB  |  1,158 lines

  1. ; FILE: Source:requestlong.ASM          REV: 206 --- number requester with gadtools
  2. ; History
  3. ;  200    16th Oct 1999: all but FOLLOWMOUSE implemented and working.
  4. ;  201    Now includes bin.saver.ASM for easy bin creation.
  5. ;  206    Should be ok.
  6. ;
  7.  
  8. ;    include    "Devpac:Gen.gs"
  9.  
  10.     include    "exec/types.i"
  11.     include    "exec/memory.i"
  12.     include    "dos/dosextens.i"
  13.     include    "utility/hooks.i"
  14.     include    "devices/inputevent.i"
  15.     include "intuition/intuition.i"
  16.     include "intuition/sghooks.i"
  17.     include    "graphics/displayinfo.i"
  18.     include "libraries/gadtools.i"
  19.  
  20.     include    "requestlong.i"
  21.  
  22.     include    "exec/exec_lib.i"
  23.     include    "graphics/graphics_lib.i"
  24.     include    "intuition/intuition_lib.i"
  25.     include    "libraries/gadtools_lib.i"
  26.      include    "utility/utility_lib.i"
  27.  
  28. call    MACRO
  29.     jsr    (_LVO\1,a6)
  30.     ENDM
  31.  
  32.     STRUCTURE rldata,0
  33.     APTR    rl_ExecBase
  34.     APTR    rl_GfxBase
  35.     APTR    rl_IntuiBase
  36.     APTR    rl_GtBase
  37.     APTR    rl_UtilBase
  38.     APTR    rl_valptr
  39.     APTR    rl_title
  40.     ULONG    rl_flags
  41.     APTR    rl_Screen
  42.     APTR    rl_ScrLock
  43.     APTR    rl_VisualInfo
  44.     ULONG    rl_giwidth
  45.     APTR    rl_GList
  46.     APTR    rl_Window
  47.     APTR    rl_IDCMPPort
  48.     APTR    rl_numgad
  49.     ULONG    rl_WaitMask
  50.     STRUCT    rl_NewGad,gng_SIZEOF
  51.     STRUCT    rl_edithook,h_SIZEOF
  52.     STRUCT    rl_str,32
  53.     LABEL    rldata_SIZEOF
  54.  
  55. ;MAXCHARS    EQU    11        ; "-2147483648"
  56. MAXCHARS    EQU    32
  57. ;CTRL_C    EQU    1
  58.  
  59. NUMGAD01_ID    EQU    1
  60.  
  61. GIMINWIDTH    EQU    40
  62. GLEFT    EQU    4
  63. GTOP    EQU    4
  64.  
  65. GHEIGHT_ADD    EQU    3*2
  66.  
  67. TITLEADD    EQU    54
  68.  
  69.  
  70. ;TESTMODE    EQU    1
  71.  
  72.  
  73.     IFD    TESTMODE
  74.  
  75. Main
  76.     ;lea    (.long,pc),a0
  77.     ;lea    (.val,pc),a1
  78.     ;moveq    #TLF_NULLTERM,d0
  79.     ;bsr    DecToLong
  80.     ;rts
  81.  
  82.     pea    $abbaf00d
  83.     move.l    sp,a0
  84.     lea    (.title,pc),a1
  85.     move.l    #RLF_ALLOWHEX|RLF_INITHEX|RLF_UNSIGNED|RLF_SHOWDEF|RLF_FOLLOWMOUSE|RLF_ALLOWEMPTY,d0
  86. ;    move.l    #RLF_ALLOWHEX|RLF_INITHEX|RLF_SHOWDEF|RLF_FOLLOWMOUSE|RLF_ALLOWEMPTY,d0
  87. ;    move.l    #RLF_SHOWDEF|RLF_UNSIGNED|RLF_FOLLOWMOUSE|RLF_ALLOWEMPTY,d0
  88.     bsr    RequestLong
  89.     move.l    (sp)+,d1
  90.     tst.l    d0
  91.     beq.b    .rts
  92.     move.l    d1,d0
  93. .rts    rts
  94.  
  95. ;.val    dc.l    0
  96. ;.long    dc.b    '$FFFFFFFF',0
  97. ;.long    dc.b    '-2147483648',0    '4294967295',0    '-1073741824',0    '3221225472',0
  98.  
  99. .title    dc.b    'Jump to...',0
  100.     CNOP    0,2
  101.  
  102.     ELSE
  103.  
  104.     ; include hunk binary saver, will
  105.     ; generate PROGDIR:requestlong.bin when run
  106.     include    "Source:bin.saver.ASM"
  107.  
  108.     ENDC
  109.  
  110.  
  111. ;  IN: a0=ptr to longword
  112. ;      a1=title, can be NULL
  113. ;      d0=flags, see above
  114. ; OUT: d0=success if user entered number
  115.  
  116. RequestLong    movem.l    d1-a6,-(sp)
  117.     moveq    #0,d7
  118.  
  119.     move.l    a0,a2
  120.     move.l    a1,a3
  121.     move.l    d0,d2
  122.  
  123.     ; remove impossible flag combinations
  124.     btst    #RLB_ALLOWHEX,d2
  125.     bne.b    .hextoo
  126.     and.w    #~RLF_INITHEX,d2
  127. .hextoo
  128.     move.l    (4).w,a6
  129.     move.l    #rldata_SIZEOF,d0
  130.     move.l    #MEMF_CLEAR,d1
  131.     call    AllocVec
  132.     tst.l    d0
  133.     beq    .exit
  134.     move.l    d0,a5
  135.     move.l    a6,(a5)            rl_ExecBase
  136.  
  137.     move.l    a2,(rl_valptr,a5)
  138.  
  139.     move.l    a3,(rl_title,a5)
  140.     bne.b    .title
  141.     lea    (DefTitle,pc),a0
  142.     move.l    a0,(rl_title,a5)
  143. .title
  144.     move.l    d2,(rl_flags,a5)
  145.  
  146.     lea    (GfxName,pc),a1
  147.     moveq    #37,d0
  148.     call    OpenLibrary
  149.     move.l    d0,(rl_GfxBase,a5)
  150.     beq.b    .freem
  151.     lea    (IntuiName,pc),a1
  152.     moveq    #37,d0
  153.     call    OpenLibrary
  154.     move.l    d0,(rl_IntuiBase,a5)
  155.     beq.b    .closeg
  156.     lea    (GtName,pc),a1
  157.     moveq    #37,d0
  158.     call    OpenLibrary
  159.     move.l    d0,(rl_GtBase,a5)
  160.     beq.b    .closei
  161.     lea    (UtilName,pc),a1
  162.     moveq    #37,d0
  163.     call    OpenLibrary
  164.     move.l    d0,(rl_UtilBase,a5)
  165.     beq.b    .closegt
  166.  
  167.     bsr    _Sub0
  168.  
  169.     move.l    (a5),a6
  170.     move.l    (rl_UtilBase,a5),a1
  171.     call    CloseLibrary
  172. .closegt    move.l    (rl_GtBase,a5),a1
  173.     call    CloseLibrary
  174. .closei    move.l    (rl_IntuiBase,a5),a1
  175.     call    CloseLibrary
  176. .closeg    move.l    (rl_GfxBase,a5),a1
  177.     call    CloseLibrary
  178. .freem    move.l    a5,a1
  179.     call    FreeVec
  180. .exit    move.l    d7,d0
  181.     movem.l    (sp)+,d1-a6
  182.     rts
  183.  
  184. GfxName    dc.b    'graphics.library',0
  185. IntuiName    dc.b    'intuition.library',0
  186. GtName    dc.b    'gadtools.library',0
  187. UtilName    dc.b    'utility.library',0
  188. DefTitle    dc.b    'Number',0
  189.     CNOP    0,2
  190.  
  191. _Sub0
  192.     move.l    (a5),a6
  193.     sub.l    a1,a1
  194.     call    FindTask
  195.     move.l    (rl_IntuiBase,a5),a6
  196.     move.l    d0,a0
  197.     cmp.b    #NT_PROCESS,(LN_TYPE,a0)
  198.     bne.b    .notproc
  199.  
  200.     move.l    (pr_WindowPtr,a0),d0
  201.     beq.b    .notproc
  202.     move.l    d0,a0
  203.     addq.l    #1,d0
  204.     beq.b    .notproc
  205.     move.l    (wd_WScreen,a0),(rl_Screen,a5)
  206.     bra.b    .gotscreen
  207. .notproc
  208.     sub.l    a0,a0
  209.     call    LockPubScreen
  210.     move.l    d0,(rl_ScrLock,a5)
  211.     move.l    d0,(rl_Screen,a5)
  212.     beq.b    .exit
  213. .gotscreen
  214.  
  215.     move.l    (rl_Screen,a5),a0
  216.     sub.l    a1,a1
  217.     move.l    (rl_GtBase,a5),a6
  218.     call    GetVisualInfoA
  219.     move.l    d0,(rl_VisualInfo,a5)
  220.     beq.b    .unlock
  221.  
  222.     bsr.b    _Sub1
  223.  
  224. .freevi    move.l    (rl_GtBase,a5),a6
  225.     move.l    (rl_VisualInfo,a5),a0
  226.     call    FreeVisualInfo
  227. .unlock    move.l    (rl_IntuiBase,a5),a6
  228.     sub.l    a0,a0
  229.     move.l    (rl_ScrLock,a5),a1
  230.     call    UnlockPubScreen
  231. .exit    rts
  232.  
  233.  
  234. _Sub1    move.l    (rl_GfxBase,a5),a6
  235.  
  236.     move.l    (rl_Screen,a5),a1
  237.     lea    (sc_RastPort,a1),a1
  238.     lea    (.somenums,pc),a0
  239.     moveq    #SOMENUMS_LEN,d0
  240.     call    TextLength
  241.     moveq    #GLEFT*2+5*2,d2
  242.     add.l    d0,d2
  243.  
  244.     move.l    (rl_title,a5),a0
  245.     move.l    a0,a1
  246.     moveq    #-1,d0
  247. .len    addq.l    #1,d0
  248.     tst.b    (a1)+
  249.     bne.b    .len
  250.     move.l    (rl_Screen,a5),a1
  251.     lea    (sc_RastPort,a1),a1
  252.     call    TextLength
  253.     add.l    #TITLEADD,d0
  254.  
  255.     cmp.l    d2,d0
  256.     bhi.b    .nope1
  257.     move.l    d2,d0
  258. .nope1    move.l    #GIMINWIDTH,d2
  259.     cmp.l    d2,d0
  260.     bhi.b    .nope2
  261.     move.l    d2,d0
  262. .nope2    move.l    d0,(rl_giwidth,a5)
  263.  
  264.     btst    #RLB_SHOWDEF,(rl_flags+3,a5)
  265.     beq.b    .nodef
  266.  
  267.     move.l    (rl_valptr,a5),a1
  268.     move.l    (a1),-(sp)
  269.     move.l    sp,a1
  270.     lea    (.putchproc,pc),a2
  271.     lea    (rl_str,a5),a3
  272.  
  273.     lea    (.fmt_lx,pc),a0
  274.     btst    #RLB_INITHEX,(rl_flags+3,a5)
  275.     beq.b    .dec
  276.  
  277.     btst    #RLB_UNSIGNED,(rl_flags+3,a5)
  278.     bne.b    .fmt
  279.  
  280.     ; handle signed hex
  281.     tst.l    (a1)
  282.     bpl.b    .fmt
  283.     neg.l    (a1)
  284.     subq.l    #.fmt_lx-.fmt_lxs,a0
  285.     bra.b    .fmt
  286.  
  287. .dec    addq.l    #.fmt_ld-.fmt_lx,a0
  288.     btst    #RLB_UNSIGNED,(rl_flags+3,a5)
  289.     beq.b    .fmt
  290.     addq.l    #.fmt_lu-.fmt_ld,a0
  291. .fmt
  292.     move.l    (a5),a6
  293.     call    RawDoFmt
  294.     addq.l    #4,sp
  295. .nodef
  296.  
  297.     move.l    (rl_GtBase,a5),a6
  298.  
  299.     move.l    (rl_Screen,a5),a0
  300.     moveq    #0,d2
  301.     move.b    (sc_WBorLeft,a0),d2    d2=leftbar
  302.     moveq    #0,d3
  303.     move.b    (sc_WBorTop,a0),d3
  304.     move.l    (sc_Font,a0),a0
  305.     move.w    (ta_YSize,a0),d4    d4=font y-size
  306.     add.w    d4,d3
  307.     addq.w    #1,d3            d3=titlebar
  308.     ; a6=gtbase
  309.     lea    (rl_GList,a5),a0
  310.     call    CreateContext
  311.     tst.l    d0
  312.     beq    .exit
  313.     move.l    d0,a3
  314.  
  315.     lea    (EditHook,pc),a0
  316.     move.l    a0,(rl_edithook+h_Entry,a5)
  317.     move.l    a5,(rl_edithook+h_Data,a5)
  318.  
  319.  
  320.     lea    (rl_NewGad,a5),a1
  321.     move.l    #GLEFT<<16|GTOP,(a1)        gng_LeftEdge,gng_TopEdge,
  322.     moveq    #-GLEFT*2,d0
  323.     add.l    (rl_giwidth,a5),d0
  324.     move.w    d0,(gng_Width,a1)
  325.     addq.w    #GHEIGHT_ADD,d4
  326.     move.w    d4,(gng_Height,a1)
  327.     move.w    #NUMGAD01_ID,(gng_GadgetID,a1)
  328.     add.w    d2,(gng_LeftEdge,a1)    Add offsets!
  329.     add.w    d3,(gng_TopEdge,a1)
  330.     ;lea    (.text,pc),a0
  331.     ;move.l    a0,(gng_GadgetText,a1)
  332.     ;move.l    #PLACETEXT_ABOVE,(gng_Flags,a1)
  333.     move.l    (rl_VisualInfo,a5),(gng_VisualInfo,a1)
  334.  
  335.     move.l    sp,d6
  336.     clr.l    -(sp)            TAG_DONE
  337.     pea    (rl_edithook,a5)
  338.     pea    GTST_EditHook
  339.  
  340.     btst    #RLB_SHOWDEF,(rl_flags+3,a5)
  341.     beq.b    .nodef2
  342.     pea    (rl_str,a5)
  343.     pea    GTST_String
  344. .nodef2
  345.     pea    (MAXCHARS).w
  346.     pea    GTST_MaxChars
  347.     move.l    sp,a2
  348.     move.l    a3,a0
  349.     moveq    #STRING_KIND,d0
  350.     call    CreateGadgetA
  351.     move.l    d6,sp
  352.     move.l    d0,(rl_numgad,a5)
  353.     beq    .freegad
  354.  
  355.     btst    #RLB_SHOWDEF,(rl_flags+3,a5)
  356.     beq.b    .nodef3
  357.     lea    (rl_str,a5),a0
  358.     moveq    #-1,d0
  359. .strlen    addq.l    #1,d0
  360.     tst.b    (a0)+
  361.     bne.b    .strlen
  362.     move.l    (rl_numgad,a5),a0
  363.     move.l    (gg_SpecialInfo,a0),a0
  364.     move.w    d0,(si_BufferPos,a0)
  365. .nodef3
  366.     move.l    sp,a2
  367.     clr.l    -(sp)            TAG_DONE
  368.     move.l    (rl_title,a5),-(sp)
  369.     pea    WA_Title
  370.     move.l    (rl_Screen,a5),-(sp)
  371.     pea    WA_CustomScreen
  372.     move.l    (rl_GList,a5),-(sp)
  373.     pea    WA_Gadgets
  374.     pea    WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SIMPLE_REFRESH|WFLG_ACTIVATE|WFLG_RMBTRAP
  375.     pea    WA_Flags
  376.     pea    IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|STRINGIDCMP|IDCMP_REFRESHWINDOW|IDCMP_ACTIVEWINDOW|IDCMP_MOUSEBUTTONS
  377.     pea    WA_IDCMP
  378.     move.l    (rl_Screen,a5),a0
  379.     ext.l    d3
  380.     ext.l    d4
  381.     add.l    d4,d3
  382.     moveq    #0,d0
  383.     move.b    (sc_WBorBottom,a0),d0
  384.     add.l    d0,d3
  385.     addq.l    #GTOP*2,d3
  386.     move.l    d3,-(sp)
  387.     pea    WA_Height
  388.     move.l    (rl_giwidth,a5),d0
  389.     moveq    #0,d1
  390.     move.b    (sc_WBorLeft,a0),d1
  391.     add.l    d1,d0
  392.     move.b    (sc_WBorRight,a0),d1
  393.     add.l    d1,d0
  394.     move.l    d0,-(sp)
  395.     pea    WA_Width
  396.  
  397.     move.l    (rl_Screen,a5),a0
  398.     swap    d0
  399.     or.l    d3,d0
  400.     bsr    Center
  401.     move.w    d0,d1
  402.     ext.l    d1
  403.     swap    d0
  404.     ext.l    d0
  405.  
  406.     move.l    d1,-(sp)
  407.     pea    WA_Top
  408.     move.l    d0,-(sp)
  409.     pea    WA_Left
  410.     move.l    (rl_IntuiBase,a5),a6
  411.     sub.l    a0,a0
  412.     move.l    sp,a1
  413.     call    OpenWindowTagList
  414.     move.l    a2,sp
  415.     move.l    d0,(rl_Window,a5)
  416.     beq.b    .freegad
  417.  
  418.     bsr    _Sub2
  419.  
  420.     move.l    (rl_Window,a5),a0
  421.     bsr    _StripMsg
  422.  
  423.     move.l    (rl_IntuiBase,a5),a6
  424.     move.l    (rl_Window,a5),a0
  425.     call    CloseWindow
  426.  
  427. .freegad    move.l    (rl_GtBase,a5),a6
  428.     move.l    (rl_GList,a5),a0
  429.     call    FreeGadgets
  430.  
  431. .exit    rts
  432.  
  433. .putchproc    move.b    d0,(a3)+
  434.     rts
  435.  
  436. ;.text    dc.b    'test',0
  437.  
  438. .fmt_lxs    dc.b    '-'
  439. .fmt_lx    dc.b    '$%lx',0
  440. .fmt_ld    dc.b    '%ld',0
  441. .fmt_lu    dc.b    '%lu',0
  442.  
  443. .somenums    dc.b    '-2147483648®'
  444. SOMENUMS_LEN    EQU    *-.somenums
  445.     CNOP    0,2
  446.  
  447.  
  448. ; EditHook call conventions
  449. ;    A0 - struct Hook *hook
  450. ;    A1 - ULONG *msg
  451. ;    A2 - struct SGWork *sgw
  452.  
  453. EditHook    cmp.l    #SGH_KEY,(a1)
  454.     beq.b    .key
  455.     moveq    #0,d0
  456.     rts
  457.  
  458. .key    movem.l    d1-d7/a0-a6,-(sp)
  459.     move.l    (h_Data,a0),a5
  460.  
  461.     IFGT    1
  462.     cmp.w    #EO_REPLACECHAR,(sgw_EditOp,a2)
  463.     beq.b    .doit2
  464.     cmp.w    #EO_INSERTCHAR,(sgw_EditOp,a2)
  465.     bne.b    .exit2
  466. .doit2
  467.     cmp.b    #27,(sgw_Code+1,a2)
  468.     bne.b    .exit2
  469.  
  470.     btst    #RLB_ESCISRETURN,(rl_flags+3,a5)
  471.     bne.b    .escisreturn
  472.  
  473.     ; ESC is cancel
  474.     move.l    (sgw_WorkBuffer,a2),a0
  475.     move.b    #27,(a0)+
  476.     clr.b    (a0)+
  477.     or.w    #SGA_END,(sgw_Actions+2,a2)
  478.     bra.b    .exit2
  479. .escisreturn
  480.     and.w    #~SGA_USE,(sgw_Actions+2,a2)
  481.  
  482.     move.l    (sgw_PrevBuffer,a2),a0
  483.     moveq    #TLF_NULLTERM,d0
  484.     bsr.b    testvalidity
  485.     bne.b    .beep2
  486.  
  487.     or.w    #SGA_END,(sgw_Actions+2,a2)
  488.     bra.b    .exit2
  489.  
  490. .beep2    or.w    #SGA_BEEP,(sgw_Actions+2,a2)
  491.  
  492. .exit2
  493.     ENDC
  494.  
  495.     IFGT    0
  496.     cmp.w    #EO_REPLACECHAR,(sgw_EditOp,a2)
  497.     beq.b    .doit0
  498.     cmp.w    #EO_INSERTCHAR,(sgw_EditOp,a2)
  499.     beq.b    .doit0
  500.     cmp.w    #EO_BIGCHANGE,(sgw_EditOp,a2)
  501.     bne.b    .exit0
  502. .doit0
  503.     move.l    (sgw_WorkBuffer,a2),a0
  504.     moveq    #TLF_NOWHITE|TLF_NULLTERM,d0
  505.     bsr.b    testvalidity
  506.     beq.b    .exit0
  507.  
  508.     or.w    #SGA_BEEP,(sgw_Actions+2,a2)
  509.     and.w    #~SGA_USE,(sgw_Actions+2,a2)
  510. .exit0
  511.     ENDC
  512.  
  513.     IFGT    1
  514.     cmp.w    #EO_ENTER,(sgw_EditOp,a2)
  515.     bne.b    .exit1
  516.  
  517.     move.l    (sgw_WorkBuffer,a2),a0
  518.     tst.b    (a0)
  519.     beq.b    .exit1
  520.  
  521.     move.l    (sgw_WorkBuffer,a2),a0
  522.     moveq    #TLF_NULLTERM,d0
  523.     bsr.b    testvalidity
  524.     beq.b    .exit1
  525.  
  526.     or.w    #SGA_BEEP,(sgw_Actions+2,a2)
  527.     and.w    #~SGA_END,(sgw_Actions+2,a2)
  528. .exit1
  529.     ENDC
  530.  
  531.     moveq    #1,d0
  532.     movem.l    (sp)+,d1-d7/a0-a6
  533.     rts
  534.  
  535.  
  536. ;  IN: a0=UBYTE *
  537. ;      a2=struct SGWork *
  538. ;      a5=rldata
  539. ;      d0=TLF flags
  540. ; OUT: d0=0 if ok, <>0 if bad, ccr set
  541. testvalidity    move.l    a1,-(sp)
  542.     lea    (sgw_LongInt,a2),a1
  543.  
  544.     btst    #RLB_ALLOWHEX,(rl_flags+3,a5)
  545.     bne.b    .hexer
  546.  
  547. .trydec    btst    #RLB_UNSIGNED,(rl_flags+3,a5)
  548.     bne.b    .unsig
  549.     bsr    DecToLong
  550.     bra.b    .was_s
  551. .unsig    bsr    DecToLongU
  552. .was_s    bmi.b    .exit
  553.  
  554. .ok    moveq    #0,d0
  555. .exit    move.l    (sp)+,a1
  556.     rts
  557.  
  558. .hexer    move.l    d0,-(sp)
  559.     btst    #RLB_UNSIGNED,(rl_flags+3,a5)
  560.     bne.b    .h_unsig
  561.     bsr    HexToLong
  562.     bra.b    .h_was_s
  563. .h_unsig    bsr    HexToLongU
  564. .h_was_s    bmi.b    .h_exit
  565.     addq.l    #4,sp            hex was ok..
  566.     bra.b    .ok
  567.  
  568.     ; hex failed, try decimal instead
  569. .h_exit    move.l    (sp)+,d0
  570.     bra.b    .trydec
  571.  
  572.  
  573. ; --------------------------------------------------------------------------
  574. ; General purpose dec & hex c-string to number conversion routines
  575. ; Support for both signed and unsigned numbers.
  576. ; Correctly handles ranges:
  577. ;   signed routines: -2147483648 to 2147483647
  578. ; unsigned routines: 0 to 4294967295
  579. ;
  580. ; Written by Harry Sintonen 3rd October 1999 in 68000 assembler.
  581. ;
  582.  
  583.     BITDEF    TL,NOWHITE,0        ; don't allow whitespaces before number
  584.     BITDEF    TL,NULLTERM,1        ; number must be null terminated
  585.     BITDEF    TL,NOHEXPREFIX,2    ; hex allowed without $ or 0x prefix
  586.  
  587. ;  IN: a0=UBYTE *str
  588. ;      a1=ULONG *num
  589. ;      d0=ULONG flags
  590. ; OUT: d0=Number of characters converted or -1, ccr set
  591. HexToLongU    movem.l    d1-d6/a0,-(sp)
  592.     moveq    #0,d1
  593.     moveq    #0,d3
  594.     moveq    #0,d4
  595.     moveq    #0,d5
  596.  
  597.     ; skip whitespaces
  598.     btst    #TLB_NOWHITE,d0
  599.     bne.b    .skipped
  600. .skipwhite    move.b    (a0)+,d3
  601.     addq.l    #1,d5
  602.     cmp.b    #' ',d3
  603.     beq.b    .skipwhite
  604.     cmp.b    #9,d3
  605.     beq.b    .skipwhite
  606.     subq.l    #1,a0
  607.     subq.l    #1,d5
  608. .skipped
  609.     ; test for $ or 0x prefix
  610.     btst    #TLB_NOHEXPREFIX,d0
  611.     bne.b    .prefixok
  612.  
  613.     addq.l    #1,d5
  614.     move.b    (a0)+,d3
  615.     cmp.b    #'$',d3
  616.     beq.b    .prefixok
  617.     cmp.b    #'0',d3
  618.     bne.b    .badprefix
  619.     addq.l    #1,d5
  620.     move.b    (a0)+,d3
  621.     or.b    #('a'-'A'),d3
  622.     cmp.b    #'x',d3
  623.     bne.b    .badprefix
  624. .prefixok
  625.  
  626. .loop    move.b    (a0)+,d3
  627.     addq.l    #1,d5
  628.     sub.b    #'0',d3
  629.     bmi.b    .non_numalpha
  630.     cmp.b    #('9'-'0'+1),d3
  631.     blt.b    .add
  632.     or.b    #('a'-'A'),d3
  633.     sub.b    #('a'-'0'),d3
  634.     bmi.b    .non_numalpha
  635.     cmp.b    #('f'-'a'+1),d3
  636.     bge.b    .non_numalpha
  637.     add.b    #($a-$0),d3
  638.  
  639. .add    move.l    #$F0000000,d2
  640.     and.l    d1,d2
  641.     bne.b    .overflow
  642.     asl.l    #4,d1
  643.     add.l    d3,d1
  644.     bcs.b    .overflow
  645.     moveq    #1,d4
  646.     bra.b    .loop
  647.  
  648. .non_numalpha    btst    #TLB_NULLTERM,d0
  649.     beq.b    .allow
  650.     tst.b    -(a0)
  651.     bne.b    .overflow
  652. .allow
  653.     subq.l    #1,d5
  654.     tst.l    d4
  655.     bne.b    .didsome
  656. .badprefix
  657. .overflow    moveq    #-1,d5
  658.     bra.b    .exit
  659. .didsome    move.l    d1,(a1)
  660. .exit    move.l    d5,d0
  661.     movem.l    (sp)+,d1-d6/a0
  662.     rts
  663.  
  664.  
  665. ;  IN: a0=UBYTE *str
  666. ;      a1=LONG *num
  667. ;      d0=ULONG flags
  668. ; OUT: d0=Number of characters converted or -1, ccr set
  669. HexToLong    movem.l    d1-d6/a0,-(sp)
  670.     moveq    #0,d1
  671.     moveq    #0,d3
  672.     moveq    #0,d4
  673.     moveq    #0,d5
  674.  
  675.     ; skip whitespaces
  676.     btst    #TLB_NOWHITE,d0
  677.     bne.b    .skipped
  678. .skipwhite    move.b    (a0)+,d3
  679.     addq.l    #1,d5
  680.     cmp.b    #' ',d3
  681.     beq.b    .skipwhite
  682.     cmp.b    #9,d3
  683.     beq.b    .skipwhite
  684.     subq.l    #1,a0
  685.     subq.l    #1,d5
  686. .skipped
  687.     ; test sign
  688.     cmp.b    #'-',(a0)
  689.     seq    d6            ; d6.b=0 -> positive, d6.b<>0 -> negative
  690.     bne.b    .nosign
  691.     addq.l    #1,d5
  692.     addq.l    #1,a0
  693. .nosign
  694.     ; test for $ or 0x prefix
  695.     btst    #TLB_NOHEXPREFIX,d0
  696.     bne.b    .prefixok
  697.  
  698.     addq.l    #1,d5
  699.     move.b    (a0)+,d3
  700.     cmp.b    #'$',d3
  701.     beq.b    .prefixok
  702.     cmp.b    #'0',d3
  703.     bne.b    .badprefix
  704.     addq.l    #1,d5
  705.     move.b    (a0)+,d3
  706.     or.b    #('a'-'A'),d3
  707.     cmp.b    #'x',d3
  708.     bne.b    .badprefix
  709. .prefixok
  710.  
  711. .loop    move.b    (a0)+,d3
  712.     addq.l    #1,d5
  713.     sub.b    #'0',d3
  714.     bmi.b    .non_numalpha
  715.     cmp.b    #('9'-'0'+1),d3
  716.     blt.b    .add
  717.     or.b    #('a'-'A'),d3
  718.     sub.b    #('a'-'0'),d3
  719.     bmi.b    .non_numalpha
  720.     cmp.b    #('f'-'a'+1),d3
  721.     bge.b    .non_numalpha
  722.     add.b    #($a-$0),d3
  723.  
  724. .add    asl.l    #4,d1
  725.     bvc.b    .nflow
  726.     bsr.b    .flow
  727. .nflow    add.l    d3,d1
  728.     bsr.b    .flow
  729.     moveq    #1,d4
  730.     bra.b    .loop
  731.  
  732. .flow    tst.b    d6
  733.     beq.b    .fouch
  734.     cmp.l    #$80000000,d1
  735.     bls.b    .frts
  736.     bra.b    .fxit
  737. .fouch    cmp.l    #$7FFFFFFF,d1
  738.     bls.b    .frts
  739. .fxit    addq.l    #4,sp
  740.     bra.b    .overflow
  741.  
  742. .non_numalpha    btst    #TLB_NULLTERM,d0
  743.     beq.b    .allow
  744.     tst.b    -(a0)
  745.     bne.b    .overflow
  746. .allow
  747.     subq.l    #1,d5
  748.     tst.l    d4
  749.     bne.b    .didsome
  750. .badprefix
  751. .overflow    moveq    #-1,d5
  752.     bra.b    .exit
  753. .didsome    tst.b    d6
  754.     beq.b    .nosign2
  755.     neg.l    d1
  756. .nosign2    move.l    d1,(a1)
  757. .exit    move.l    d5,d0
  758.     movem.l    (sp)+,d1-d6/a0
  759. .frts    rts
  760.  
  761.  
  762. ;  IN: a0=UBYTE *str
  763. ;      a1=ULONG *num
  764. ;      d0=ULONG flags
  765. ; OUT: d0=Number of characters converted or -1, ccr set
  766. DecToLongU    movem.l    d1-d6/a0,-(sp)
  767.     moveq    #0,d1
  768.     moveq    #'9'-'0'+1,d2
  769.     moveq    #0,d3
  770.     moveq    #0,d4
  771.     moveq    #0,d5
  772.  
  773.     btst    #TLB_NOWHITE,d0
  774.     bne.b    .loop
  775.  
  776. .skipwhite    move.b    (a0)+,d3
  777.     addq.l    #1,d5
  778.     cmp.b    #' ',d3
  779.     beq.b    .skipwhite
  780.     cmp.b    #9,d3
  781.     beq.b    .skipwhite
  782.     bra.b    .goloop
  783. .loop    move.b    (a0)+,d3
  784.     addq.l    #1,d5
  785. .goloop    sub.b    #'0',d3
  786.     bmi.b    .nondec
  787.     cmp.b    d2,d3
  788.     bge.b    .nondec
  789.     move.l    #$E0000000,d6
  790.     and.l    d1,d6
  791.     bne.b    .overflow
  792.     move.l    d1,d6
  793.     asl.l    #3,d1
  794.     add.l    d6,d1
  795.     bcs.b    .overflow
  796.     add.l    d6,d1
  797.     bcs.b    .overflow
  798.     add.l    d3,d1
  799.     bcs.b    .overflow
  800.     moveq    #1,d4
  801.     bra.b    .loop
  802.  
  803. .nondec    btst    #TLB_NULLTERM,d0
  804.     beq.b    .allow
  805.     tst.b    -(a0)
  806.     bne.b    .overflow
  807. .allow
  808.     subq.l    #1,d5
  809.     tst.l    d4
  810.     bne.b    .didsome
  811. .overflow    moveq    #-1,d5
  812.     bra.b    .exit
  813. .didsome    move.l    d1,(a1)
  814. .exit    move.l    d5,d0
  815.     movem.l    (sp)+,d1-d6/a0
  816.     rts
  817.  
  818. ;  IN: a0=UBYTE *str
  819. ;      a1=LONG *num
  820. ;      d0=ULONG flags
  821. ; OUT: d0=Number of characters converted or -1, ccr set
  822. DecToLong    movem.l    d1-d7/a0-a1,-(sp)
  823.     moveq    #0,d1
  824.     moveq    #'9'-'0'+1,d2
  825.     moveq    #0,d3
  826.     moveq    #0,d4
  827.     moveq    #0,d5
  828.     moveq    #0,d6
  829.  
  830.     btst    #TLB_NOWHITE,d0
  831.     beq.b    .skipwhite
  832.     move.b    (a0)+,d4
  833.     bra.b    .nowhite
  834.  
  835. .skipwhite    move.b    (a0)+,d4
  836.     addq.l    #1,d6
  837.     cmp.b    #' ',d4
  838.     beq.b    .skipwhite
  839.     cmp.b    #9,d4
  840.     beq.b    .skipwhite
  841. .nowhite    cmp.b    #'-',d4
  842.     bne.b    .positive
  843.     moveq    #1,d3
  844. .loop    move.b    (a0)+,d4
  845.     addq.l    #1,d6
  846. .positive    sub.b    #'0',d4
  847.     bmi.b    .nondec
  848.     cmp.b    d2,d4
  849.     bge.b    .nondec
  850.     move.l    d1,d7
  851.     asl.l    #3,d1
  852.     bvc.b    .noflow
  853.     bsr.b    .flow
  854. .noflow    add.l    d7,d1
  855.     bsr.b    .flow
  856.     add.l    d7,d1
  857.     bsr.b    .flow
  858.     add.l    d4,d1
  859.     bsr.b    .flow
  860.     moveq    #1,d5
  861.     bra.b    .loop
  862.  
  863. .flow    tst.l    d3
  864.     beq.b    .fouch
  865.     cmp.l    #$80000000,d1
  866.     bls.b    .frts
  867.     bra.b    .fxit
  868. .fouch    cmp.l    #$7FFFFFFF,d1
  869.     bls.b    .frts
  870. .fxit    addq.l    #4,sp
  871.     bra.b    .overflow
  872.  
  873.  
  874. .nondec    btst    #TLB_NULLTERM,d0
  875.     beq.b    .allow
  876.     tst.b    -(a0)
  877.     bne.b    .overflow
  878. .allow
  879.     subq.l    #1,d6
  880.     tst.l    d5
  881.     bne.b    .didsome
  882. .overflow    moveq    #-1,d6
  883.     bra.b    .exit
  884. .didsome    tst.l    d3
  885.     beq.b    .nosign
  886.     neg.l    d1
  887. .nosign    move.l    d1,(a1)
  888. .exit    move.l    d6,d0
  889.     movem.l    (sp)+,d1-d7/a0-a1
  890. .frts    rts
  891.  
  892.  
  893.  
  894. ; --------------------------------------------------------------------------
  895.  
  896.  
  897. ;  IN: a0=UBYTE *str
  898. ;      a1=ULONG *num (can be LONG too)
  899. ;      a5=rldata
  900. ;      d0=ULONG flags
  901. ; OUT: d0=Number of characters converted or -1, ccr set
  902. StrToLong    btst    #RLB_ALLOWHEX,(rl_flags+3,a5)
  903.     bne.b    .hexer
  904.  
  905. .trydec    btst    #RLB_UNSIGNED,(rl_flags+3,a5)
  906.     bne    DecToLongU
  907.     bra    DecToLong
  908.  
  909. .hexer    move.l    d0,-(sp)
  910.     btst    #RLB_UNSIGNED,(rl_flags+3,a5)
  911.     bne.b    .h_unsig
  912.     bsr    HexToLong
  913.     bra.b    .h_was_s
  914. .h_unsig    bsr    HexToLongU
  915. .h_was_s    bmi.b    .h_exit
  916.     addq.l    #4,sp            hex was ok..
  917.     rts
  918.  
  919.     ; hex failed, try decimal instead
  920. .h_exit    move.l    (sp)+,d0
  921.     bra.b    .trydec
  922.  
  923.  
  924.  
  925. _StripMsg    move.l    (wd_UserPort,a0),a0
  926.     move.l    (rl_GtBase,a5),a6
  927. .loop    move.l    a0,-(sp)
  928.     call    GT_GetIMsg
  929.     move.l    (sp)+,a0
  930.     tst.l    d0
  931.     beq.b    .done
  932.     move.l    d0,a1
  933.     call    GT_ReplyIMsg
  934.     bra.b    .loop
  935. .done    rts
  936.  
  937.  
  938. _Sub2    move.l    (rl_Window,a5),a0
  939.     sub.l    a1,a1
  940.     move.l    (rl_GtBase,a5),a6
  941.     call    GT_RefreshWindow
  942.  
  943.     move.l    (rl_Window,a5),a0
  944.     move.l    (wd_UserPort,a0),a0
  945.     move.l    a0,(rl_IDCMPPort,a5)
  946.     move.b    (MP_SIGBIT,a0),d0
  947.     moveq    #1,d1
  948.     lsl.l    d0,d1
  949.     IFD    CTRL_C
  950.     or.w    #SIGBREAKF_CTRL_C,d0
  951.     ENDC
  952.     or.l    d1,(rl_WaitMask,a5)
  953.  
  954. .mloop    move.l    (a5),a6
  955.     move.l    (rl_WaitMask,a5),d0
  956.     call    Wait
  957.  
  958.     IFD    CTRL_C
  959.     sub.l    a0,a0
  960.     and.l    #SIGBREAKF_CTRL_C,d0
  961.     bne    .quit
  962.     ENDC
  963.  
  964. .loop    move.l    (rl_GtBase,a5),a6
  965.     move.l    (rl_IDCMPPort,a5),a0
  966.     call    GT_GetIMsg
  967.     tst.l    d0
  968.     beq.b    .mloop
  969.     move.l    d0,a2
  970.  
  971.     move.l    (im_Class,a2),d0
  972.     cmp.l    #IDCMP_REFRESHWINDOW,d0
  973.     bne.b    .skipm0
  974.     move.l    a6,-(sp)
  975.     move.l    (rl_Window,a5),a0
  976.     call    GT_BeginRefresh
  977.     move.l    (rl_Window,a5),a0
  978.     moveq    #1,d0
  979.     call    GT_EndRefresh
  980.     move.l    (sp)+,a6
  981.     bra.b    .reply
  982. .skipm0
  983.     move.l    d0,d1
  984.     and.l    #IDCMP_ACTIVEWINDOW|IDCMP_MOUSEBUTTONS,d1
  985.     beq.b    .skipm2
  986.  
  987.     move.l    (rl_numgad,a5),a0
  988. .activate    move.l    (rl_Window,a5),a1
  989.     movem.l    a2/a6,-(sp)
  990.     sub.l    a2,a2
  991.     move.l    (rl_IntuiBase,a5),a6
  992.     call    ActivateGadget
  993.     movem.l    (sp)+,a2/a6
  994.     bra.b    .reply
  995.  
  996. .skipm2    cmp.l    #IDCMP_GADGETUP,d0
  997.     bne.b    .skipm1
  998.     move.l    (im_IAddress,a2),a0
  999.     cmp.w    #NUMGAD01_ID,(gg_GadgetID,a0)
  1000.     bne.b    .skipg0
  1001.  
  1002.     btst    #RLB_ALLOWEMPTY,(rl_flags+3,a5)
  1003.     bne.b    .allow
  1004.     move.l    (gg_SpecialInfo,a0),a1
  1005.     move.l    (a1),a1            (si_Buffer,a1),a1
  1006.     tst.b    (a1)
  1007.     beq.b    .activate
  1008. .allow
  1009. .doquit    move.l    a0,-(sp)
  1010.     move.l    a2,a1
  1011.     call    GT_ReplyIMsg
  1012.     move.l    (sp)+,a0
  1013.     bra.b    .quit
  1014. .skipg0    ;bra.b    .reply
  1015.  
  1016. .skipm1    cmp.l    #IDCMP_CLOSEWINDOW,d0
  1017.     beq.b    .doquit
  1018. .skipm3
  1019.  
  1020. .reply    move.l    a2,a1
  1021.     call    GT_ReplyIMsg
  1022.     bra    .loop
  1023.  
  1024. .quit
  1025.     IFD    CTRL_C
  1026.     move.l    a0,d0
  1027.     beq.b    .false
  1028.     ENDC
  1029.     move.l    (gg_SpecialInfo,a0),a0
  1030.     move.l    (a0),d0            (si_Buffer,a0),d0
  1031.     beq.b    .nostr
  1032.  
  1033.     move.l    d0,a0            a0=ptr to str
  1034.     move.l    (rl_valptr,a5),a1    a1=ptr to dest (U)LONG
  1035.     moveq    #TLF_NULLTERM,d0
  1036.     bsr    StrToLong
  1037.     spl    d7            signal ok!
  1038. .nostr
  1039.     rts
  1040.  
  1041.  
  1042.  
  1043. ;  IN: a0=screen
  1044. ;      d0=width<<16 | height
  1045. ;      a5=rldata
  1046. ; OUT: d0=xpos<<16 | ypos
  1047. Center2Screen    movem.l    d0-a6,-(sp)
  1048.  
  1049.     move.l    a0,a4            a4=screen
  1050.  
  1051.     clr.l    -(sp)            Rectangle
  1052.     clr.l    -(sp)
  1053.  
  1054.     move.l    (rl_GfxBase,a5),a6
  1055.  
  1056.     lea    (sc_ViewPort,a4),a0
  1057.     call    GetVPModeID
  1058.  
  1059.     move.l    (rl_IntuiBase,a5),a6
  1060.     move.l    d0,a0
  1061.     move.l    sp,a1
  1062.     moveq    #OSCAN_TEXT,d0
  1063.     call    QueryOverscan
  1064.  
  1065.     move.w    (ra_MaxX,sp),d1
  1066.     ext.l    d1
  1067.     move.w    (ra_MinX,sp),d0
  1068.     ext.l    d0
  1069.     sub.l    d0,d1
  1070.     addq.l    #1,d1
  1071.  
  1072.     move.w    (ra_MaxY,sp),d2
  1073.     ext.l    d2
  1074.     move.w    (ra_MinY,sp),d0
  1075.     ext.l    d0
  1076.     sub.l    d0,d2
  1077.     addq.l    #1,d2
  1078.  
  1079.     addq.l    #8,sp
  1080.  
  1081.     move.w    (sc_Width,a4),d0
  1082.     ext.l    d0
  1083.     move.w    (sc_LeftEdge,a4),d3
  1084.     cmp.l    d1,d0
  1085.     bge.b    .wge
  1086.     move.l    d0,d1
  1087.     moveq    #0,d3
  1088. .wge    ext.l    d3
  1089.     move.w    (sc_Height,a4),d0
  1090.     ext.l    d0
  1091.     move.w    (sc_TopEdge,a4),d4
  1092.     cmp.l    d2,d0
  1093.     bge.b    .hge
  1094.     move.l    d0,d2
  1095.     moveq    #0,d4
  1096. .hge    ext.l    d4
  1097.  
  1098.     move.w    (sp),d0            d0=width<<16 | height
  1099.     ext.l    d0
  1100.     sub.l    d0,d1
  1101.     asr.l    #1,d1
  1102.     sub.l    d3,d1
  1103.  
  1104.     move.w    (2,sp),d0
  1105.     ext.l    d0
  1106.     sub.l    d0,d2
  1107.     asr.l    #1,d2
  1108.     sub.l    d4,d2
  1109.  
  1110.     swap    d1
  1111.     move.w    d2,d1
  1112.  
  1113.     move.l    d1,(sp)
  1114.     movem.l    (sp)+,d0-a6
  1115.     rts
  1116.  
  1117.  
  1118. ;  IN: a0=screen
  1119. ;      d0=width<<16 | height
  1120. ;      a5=rldata
  1121. ; OUT: d0=xpos<<16 | ypos
  1122. Center    btst    #RLB_FOLLOWMOUSE,(rl_flags+3,a5)
  1123.     beq    Center2Screen
  1124.     ;bra    FollowMouse
  1125.  
  1126. ;  IN: a0=screen
  1127. ;      d0=width<<16 | height
  1128. ; OUT: d0=xpos<<16 | ypos
  1129.  
  1130. FM_YADD    EQU    6
  1131.  
  1132. FollowMouse    movem.l    d1-d3,-(sp)
  1133.  
  1134.     move.l    (sc_MouseY,a0),d3    read sc_MouseY and sc_MouseX
  1135.     move.w    d3,d2            d2.w=mousex
  1136.     swap    d3            d3.w=moysey
  1137.  
  1138.     move.w    d0,d1
  1139.     swap    d0
  1140.     lsr.w    #1,d1            d1.w=height/2
  1141.     lsr.w    #1,d0            d0.w=width/2
  1142.  
  1143.     sub.w    d0,d2            d2=xpos=mousex-width/2
  1144.     bpl.b    .pl1
  1145.     moveq    #0,d2
  1146. .pl1    sub.w    d1,d3            d3=ypos=mousey-height/2
  1147.     subq.w    #FM_YADD,d3
  1148.     bpl.b    .pl2
  1149.     moveq    #0,d3
  1150. .pl2    swap    d2
  1151.     move.w    d3,d2            d2=xpos<<16 | ypos
  1152.     move.l    d2,d0
  1153.  
  1154.     movem.l    (sp)+,d1-d3
  1155.     rts
  1156.  
  1157.     END
  1158.